import jsonpath
from jsonpath_ng import parse
from jsonpath_ng.jsonpath import Fields, Index

from common.logger import GetLogger


def update_value_to_json(json_object, json_path, new_value):
    """
    通过 jsonpath 替换或删除 JSON 数据中的指定字段

    :param json_object: dict/json，原始数据对象
    :param json_path: str，目标字段的 jsonpath 表达式，例如 '$.goods_gallery_list[0].sort'
    :param new_value: 任意类型，新值；若为 '$del' 表示删除该字段
    :return: 更新后的 json 对象
    """
    for match in parse(json_path).find(json_object):
        container = match.context.value  # 父级容器（dict 或 list）
        key = match.path.fields[0] if isinstance(match.path, Fields) else match.path.index

        if new_value == '$del':
            del container[key]
        else:
            container[key] = new_value

    return json_object

def extract_json(json_object, json_path, index=0):
    """
    使用 jsonpath 提取 JSON 数据
    :param json_object: 目标 JSON 对象
    :param json_path: jsonpath 表达式
    :param index: 要提取第几个匹配结果；<0 表示返回全部
    """
    logger = GetLogger.get_logger()

    res = jsonpath.jsonpath(json_object, json_path)

    # jsonpath 未匹配到值会返回 False
    if not res:
        logger.warning(f"通过 {json_path} 未匹配到任何值")
        return None

    # 匹配到了数据，这里 res 一定是 list
    logger.info(f"通过 {json_path} 匹配到的结果: {res}")

    # index < 0 → 全部返回
    if index < 0:
        return res

    # index >= 0 → 单个返回，需要判断范围
    if index >= len(res):
        logger.warning(f"索引 {index} 超出结果范围，结果长度为 {len(res)}")
        return None

    return res[index]

if __name__ == '__main__':
    json_object = {
        "brand_id": "",
        "category_id": 83,
        "goods_name": "a商品",
        "goods_gallery_list": [
            {"img_id": -1, "original": "http://xx.png", "sort": 0}
        ],
        "quantity": 99999999,
    }

    # 示例1：替换
    print(update_value_to_json(json_object, '$.goods_gallery_list[0]', 'xxxxxxxx'))

    # 示例2：删除字段
    # print(update_value_to_json(json_object, '$.goods_gallery_list[0].sort', '$del'))
